const WebSocket = require('ws');
const jwt = require('jsonwebtoken');
const config = require('../../config');
class WebSocketServer {
  constructor(server) {
    this.wss = new WebSocket.Server({ port: 9000 });
    this.clients = new Map(); // 存储 WebSocket 连接（userId -> ws 实例）
    this.init();
  }

  init() {
    this.wss.on('connection', (ws, req) => {
      // 获取子协议（即 userStore.token）
      const protocols = req.headers['sec-websocket-protocol'];
      if (!protocols) {
        ws.close();
        return;
      }
      const { userId } = jwt.verify(protocols, config.JWT_SECRET);

      // 存储 WebSocket 连接
      this.clients.set(userId, ws);
      // 监听消息
      ws.on('message', message => this.handleMessage(userId, message));

      // 监听断开
      ws.on('close', () => {
        this.clients.delete(userId);
      });

      // 监听错误
      ws.on('error', err => {
        console.error(`WebSocket 错误: ${err.message}`);
      });

      // 发送心跳检测
      this.heartbeat(ws);
    });
  }

  // 处理接收的消息
  handleMessage(userId, message) {
    try {
      const data = JSON.parse(message);
      if (data.type === 'ping') {
        this.sendMessage(userId, { type: 'pong' }); // 返回心跳
      }
    } catch (err) {
      console.error('解析消息失败', err);
    }
  }

  // 发送消息
  sendMessage(userId, data) {
    const ws = this.clients.get(userId);
    if (ws && ws.readyState === WebSocket.OPEN) {
      ws.send(JSON.stringify(data));
    }
  }

  // 广播消息
  broadcast(data) {
    for (const [userId, ws] of this.clients) {
      if (ws.readyState === WebSocket.OPEN) {
        ws.send(JSON.stringify({ type: 'SYSTEM', data }));
      } else {
        this.clients.delete(userId); // 清理无效连接
      }
    }
  }

  // 发送群组消息
  sendToGroup(userIds, data) {
    userIds.forEach(userId => this.sendMessage(userId, { type: 'MESSAGE', data }));
  }

  // 心跳检测，防止长时间不活动断开
  heartbeat(ws) {
    const interval = setInterval(() => {
      if (ws.readyState !== WebSocket.OPEN) {
        clearInterval(interval);
        return;
      }
      ws.send(JSON.stringify({ type: 'ping' }));
    }, 30000); // 每 30 秒发送一次心跳

    ws.on('close', () => clearInterval(interval)); // 连接关闭时清理定时器
  }
}

module.exports = WebSocketServer;
